package com.tian.config;

import com.tian.exception.BusinessException;
import com.tian.factory.ApplicationContextFactory;
import com.tian.simulate.ChargingDataReportTask;
import com.tian.util.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;

/**
 * {@code @description:} 异步执行任务
 *
 * @author tianwc 公众号：Java后端技术全栈
 * 在线刷题 1200+java面试题和1000+篇技术文章：<a href="https://woaijava.cc/">博客地址</a>
 * {@code @date:} 2024-12-13 10:00
 * {@code @version:} 1.0
 */

/**
 * 测试ThreadPollTaskScheduler业务类
 */
@Component
@Slf4j
public class ThreadPollTaskSchedulerService {

    @Resource
    // 注入线程池任务调度类
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    /**
     * 使用线程池启动定时任务
     *
     * @param gunNo 任务名称
     */
    public void startTask(String gunNo) {
        //计算2s后的时间
        Date date = DateUtils.addSecond(new Date(), 2);
        //实现线程方法
        ChargingDataReportTask task = ApplicationContextFactory.getBean(ChargingDataReportTask.class);
        task.setGunNo(gunNo);
        //放入线程池启动
        ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler.scheduleAtFixedRate(task, date, 5000);
        //保存线程信息,关闭时使用
        DynamicThreadPoolTaskSchedulerConfig.map.put(gunNo, scheduledFuture);
    }

    /**
     * 根据任务名称,关闭任务
     */
    public boolean stopTask(String gunNo) {
        if (DynamicThreadPoolTaskSchedulerConfig.map.containsKey(gunNo)) {
            log.info("当前线程是否关闭-->" + DynamicThreadPoolTaskSchedulerConfig.map.get(gunNo).isDone());
            boolean cancel = DynamicThreadPoolTaskSchedulerConfig.map.get(gunNo).cancel(true);
            log.info("当前线程是否关闭-->" + DynamicThreadPoolTaskSchedulerConfig.map.get(gunNo).isDone());
            DynamicThreadPoolTaskSchedulerConfig.map.remove(gunNo);
            return cancel;
        } else {
            throw new BusinessException("要停止的任务不存在");
        }
    }
}